package com.qing.demo.netty.server;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.qing.demo.netty.domain.*;
import com.qing.demo.netty.util.CacheUtil;
import com.qing.demo.netty.util.FileUtil;
import com.qing.demo.netty.util.MsgUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.socket.SocketChannel;


/**
 * @author caozhipeng
 * @date 2025/7/25
 */
public class MyServerHandler extends ChannelInboundHandlerAdapter {
//   当客户端主动链接后，这个通道就是活跃的，可以发送数据给客户端
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        SocketChannel socketChannel=(SocketChannel)ctx.channel();
        System.out.println("链接报告开始");
        System.out.println("链接报告信息：有一个客户端链接到本地服务器");
        System.out.println("链接报告IP:"+ socketChannel.localAddress().getHostString());
        System.out.println("链接报告端口:"+ socketChannel.localAddress().getPort());
        System.out.println("链接报告结束");

        // 发送消息
//        String msg = "通知客户端链接建立成功！\r\n";
//        ctx.writeAndFlush(MsgUtil.buildMsg(socketChannel.id().toString(),msg));
    }

    /**
     * 当客户端主动断开服务器连接后，这个通道就是不活跃的，不可以传递数据
     * @param ctx
     * @throws Exception
     */
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端断开链接");
    }

    // 异常处理
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
        System.out.println("异常信息："+cause.getMessage());
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
//        数据格式验证
        if(!(msg instanceof FileTransferProtocol)) return;

        FileTransferProtocol fileTransferProtocol= (FileTransferProtocol) msg;
//        0 传输文件‘请求’ 1文件传输‘指令’ 2文件传输‘数据’
        switch (fileTransferProtocol.getTransferType()){
            case 0:
                FileDescInfo fileDescInfo= (FileDescInfo) fileTransferProtocol.getTransferObj();
//                断点续传信息，实际应用中需要将断点续传信息保存到数据库
                FileBurstInstruct fileBurstInstructOld= CacheUtil.fileBurstInstructMap.get(fileDescInfo.getFileName());
                if(null!=fileBurstInstructOld){
                    if(fileBurstInstructOld.getStatus()== Constants.FileStatus.COMPLETE){
                        CacheUtil.fileBurstInstructMap.remove(fileDescInfo.getFileName());
                    }
//                    传输完成删除端点信息
                    System.out.println("文件传输完成，删除端点信息");
                    ctx.writeAndFlush(MsgUtil.buildTransferInstruct(fileBurstInstructOld));
                }

//                发送信息
                FileTransferProtocol sendFileTransferProtocol=MsgUtil.buildTransferInstruct(fileDescInfo.getFileUrl(),0,Constants.FileStatus.BEGIN);
                System.out.println("发送给客户端信息："+JSONUtil.toJsonStr(sendFileTransferProtocol));
                ctx.writeAndFlush(sendFileTransferProtocol);
                break;
            case 2:
                FileBurstData fileBurstData= (FileBurstData) fileTransferProtocol.getTransferObj();
                FileBurstInstruct fileBurstInstruct= FileUtil.writeFile("/Users/caozhipeng/Desktop/2025/xx-springcloudalibaba/netty/demo204/src/main/resources/files/",fileBurstData);
//                保存断点续传信息
                CacheUtil.fileBurstInstructMap.put(fileBurstData.getFileName(),fileBurstInstruct);
                ctx.writeAndFlush(MsgUtil.buildTransferInstruct(fileBurstInstruct));
                System.out.println("接收时间："+ DateUtil.date()+" 接收文件：--->"+fileBurstData.getFileName());
//                传输完成删除端点信息
                if(fileBurstInstruct.getStatus()== Constants.FileStatus.COMPLETE){
                    System.out.println("文件传输完成，删除端点信息");
                    CacheUtil.fileBurstInstructMap.remove(fileBurstData.getFileName());
                }
                break;
            default:
                break;
        }
    }

}
